package base;

import com.example.googlemarketdemo.R;

import factory.ThreadPoolExecutorProxyFactory;

import utils.UIUtils;
import android.content.Context;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;

/**
 * 放置4个常见的页面
 * @author Anson-pc
 *
 */
public abstract class LoadingPager extends FrameLayout{

	private View loadingView;
	private View errorView;
	private View emptyView;
	private View mSuccessView;
	
	//页面的显示状态
	public static final int STATE_LOADING = 0;//加载页面
	public static final int STATE_EMPTY = 1;//空页面
	public static final int STATE_ERROR = 2;//错误页面
	public static final int STATE_SUCCESS = 3;//成功页面
	public static final int STATE_NONE = 4 ;//初始状态
	
	//设置一个默认的状态
	public int mCurState = STATE_NONE;
	private Button retry_bt;
	

	public LoadingPager(Context context) {
		super(context);
		initCommenView();
	}

	/**
	 * 初始化常规视图
	 */
	private void initCommenView() {
		//加载页面
		loadingView = View.inflate(UIUtils.getContext(), R.layout.pager_loading, null);
		this.addView(loadingView);
		//错误页面
		errorView = View.inflate(UIUtils.getContext(), R.layout.pager_error, null);
		this.addView(errorView);
		//空页面
		emptyView = View.inflate(UIUtils.getContext(), R.layout.pager_empty, null);
		this.addView(emptyView);
		
		//根据UI刷新，来选择界面
		refreshUIBystate();
	}

	/**
	 * 根据ui刷新界面
	 * 触发加载数据之前，状态被重置
	 * 触发加载数据，数据加载完成后，得到数据加载结果，会重新加载UI
	 */
	private void refreshUIBystate() {
		//控制空视图的显示和隐藏
		emptyView.setVisibility((mCurState == STATE_EMPTY)?0:8);
		//控制错误视图的显示和隐藏
		errorView.setVisibility((mCurState == STATE_ERROR)?0:8);
		retry_bt = (Button) errorView.findViewById(R.id.error_btn_retry);
		retry_bt.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				//触发加载数据
System.out.println("点了触发加载数据");
				tiggerloadData();
			}
		});
		
		//控制加载视图的显示和隐藏
		loadingView.setVisibility((mCurState == STATE_LOADING)||(mCurState == STATE_NONE)?0:8);
		
		//数据加载成功之后显示的视图
		if (mCurState == STATE_SUCCESS && mSuccessView == null) {
			mSuccessView = initSuccessView();
			//添加成功的视图
			this.addView(mSuccessView);
		}
		
		if (mSuccessView != null) {
			//控制是视图的显示和隐藏
			mSuccessView.setVisibility((mCurState==STATE_SUCCESS)?0:8);
		}
	}

	

	/**
	 * 触发异步加载数据
	 * @call 外界需要触发加载数据的时候
	 */
	public void tiggerloadData(){
		if (mCurState != STATE_SUCCESS && mCurState != STATE_LOADING) {
			//重置当前的状态
			mCurState = STATE_LOADING;
			//刷新UI
			refreshUIBystate();
			//开启子线程
//			new Thread(new LoadDataTask()).start();
			ThreadPoolExecutorProxyFactory.getNormalPoolExecutorProxy().execute(new LoadDataTask());
		}
		
	}
	
	/**
	 * 加载数据的方法
	 * @author Anson-pc
	 *
	 */
	class LoadDataTask implements Runnable{

		@Override
		public void run() {
			//正在加载数据
			//加载成功后返回一个临时的状态
			LoadResult tempState = initData();
			System.out.println(tempState+"---");
			mCurState = tempState.state;
			
			//刷新UI,判断当前的线程是主线程还是子线程
			UIUtils.postTaskSafely(new Runnable(){

				@Override
				public void run() {
					//刷新UI界面的方法
					refreshUIBystate();
				}
				
			});
		}
	}
	
	/**
	 * 在子线程中执行，外界调用了tiggerloadData()会执行
	 * 必须实现的，但是不知道具体实现，交给子类去实现
	 * @return
	 */
	protected abstract LoadResult initData() ;
	
	/**
	 * 创建成功的加载视图，触发加载数据
	 * 数据加载完成，得到数据加载结果，会重新刷新UI,而且数据加载成功并且视图还没有创建的时候会执行此方法
	 * @return
	 */
	protected abstract View initSuccessView();
	
	
	/**
	 * 加载的三种状态
	 */
	public enum LoadResult{
		SUCCESS(STATE_SUCCESS),ERROR(STATE_ERROR),EMPTY(STATE_EMPTY);
		int state;
		private LoadResult(int state){
			this.state = state;
		}
	}
}
